#ifndef __VTOR_IAP_H__
#define __VTOR_IAP_H__

#ifdef __cplusplus
extern "C" {
#endif

#include "vtor_elec_module_config.h"

#ifdef __VTOR_IAP__


// 检测crc，保证文件完整
#define __VTOR_IAP_CONFIG_SAFE_IAP__



//#define __VTOR_IAP_STM32F103C8__
#define __VTOR_IAP_STM32L431CB__

#ifdef __VTOR_IAP_STM32F103C8__

// stm32f10c8t6 48pin 64k flash 20k ram
// stm32f10cbt6 48pin 128k flash 20k ram
// page大小固定为0x400，也就是1kb
// https://blog.csdn.net/fantastic_sky/article/details/110229474

// #define FLASH_PAGE_SIZE		0x400U
#define VtorFlashPageSize	FLASH_PAGE_SIZE
#define VtorIapBufSize		VtorFlashPageSize
#define EepromFlashPageCnt	4
#define EepromDataSize		0x0080
#define EepromFlashAddr		0x08004000
#define APP_ADDR			0x08005000
#define BAK_ADDR			0x08010000
#define APK_PAGE_CNT		((BAK_ADDR - APP_ADDR) / VtorFlashPageSize)
#endif

#ifdef __VTOR_IAP_STM32L431CB__
// stm32l431cb 48pin 128kb flash 64kb ram
// stm32l431cc 48pin 256kb flash 64kb ram
// page大小固定为0x800，也就是2kb

// #define FLASH_PAGE_SIZE		0x800U
#define VtorFlashPageSize	FLASH_PAGE_SIZE
#define VtorIapBufSize		VtorFlashPageSize
#define EepromFlashPageCnt	2
#define EepromDataSize		0x0080
#define EepromFlashAddr		0x08004000
#define APP_ADDR			0x08005000
#define BAK_ADDR			0x08010000
#define APK_PAGE_CNT		((BAK_ADDR - APP_ADDR) / VtorFlashPageSize)
#endif

#define VTOR_IAP_FILE_NAME_LEN	20

typedef struct
{
	int iapStartAddr;
	int iapTotalSize;
	int iapStartFlag;
	int iapCurRxCnt;
	int iapTotalRxCnt;
	uint8_t* iapBuf;
	int iapBufSize;
	int iapCrc;
}VtorIap;

typedef struct
{
	uint8_t fileName[VTOR_IAP_FILE_NAME_LEN];
	uint32_t fileSize; // 文件大小（字节）
	uint32_t fileVersion; // 版本号
	uint32_t fileCrc; // 文件crc
}VtorFile;

typedef struct
{
	uint32_t idx; // 递增序号，最大的为最新
	uint32_t revIdx; // 序号反码，用于校验
	VtorFile curFile; // 当前文件
	VtorFile newFile; // 更新文件
}VtorIapEepromData;



// app 部分代码
void VtorIap_Reset(void);
uint32_t VtorIap_EraseEerpom(void);
uint32_t VtorIap_WriteFlash(void);
void VtorIap_ReceiveDataTask(void);
uint32_t VtorIap_SetNewVersion(int newVersion);

// 启动传输文件和停止传输文件的api
void VtorIap_StartIap(uint8_t* fileName, uint32_t fileSize);
uint32_t VtorIap_StopIap(uint32_t crc);


// boot 部分代码
int VtorIap_Update(void);
void VtorIap_CheckUpdate(void);
void VtorIap_JumpApp(uint32_t appxaddr);


#endif // __VTOR_IAP__

#ifdef __cplusplus
}
#endif

#endif
